跳到主要内容

Linux 抓包工具 tcpdump

首先安装 tcpdump

sudo apt update
sudo apt install tcpdump

Linux 抓包工具 tcpdump 可以将网络中传送的数据包完整的截获下来然后进行分析

默认输入 tcpdump 这个命令,回车操作之后,它将监视第一个网络接口上所有流过的数据包,一般是 eth0,如下所示:

$ sudo tcpdump

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp1s0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:10:57.917041 STP 802.1s, Rapid STP, CIST Flags [Learn, Forward, Agreement], length 102
10:10:57.966763 IP 10.9.14.95.51003 > 230.0.0.1.6666: UDP, length 50
10:10:57.967647 IP alsritter-PC.48389 > myspdc01.mysoft.com.cn.domain: 62469+ PTR? 1.0.0.230.in-addr.arpa. (40)
10:10:57.974354 IP 10.9.14.87.60656 > 230.0.0.1.6666: UDP, length 50
10:10:58.056537 ARP, Request who-has alsritter-PC tell 0.0.0.0, length 46
10:10:58.056554 ARP, Reply alsritter-PC is-at 2c:f0:5d:c7:9c:f5 (oui Unknown), length 28
10:10:58.071501 IP 10.9.14.126.63342 > 230.0.0.1.6666: UDP, length 50

如上所示,它可以抓各层的包,例如链路层的 ARP 协议

监视指定网络接口的数据包

抓取经过这个具体接口的所有数据包。

$ tcpdump -i eth1

监视指定主机的数据包

host 后面加主机的 IP 地址,就可以只抓取这个主机的所有数据包,其他主机的数据包就会被过滤掉。

$ tcpdump host 175.8.50.137

如果需要捕获该主机与特定某主机的交互数据包,可以用逻辑运算符来表示:

$ tcpdump host 175.8.50.137 and 100.27.48.1

这就表示只有主机 175.8.50.137 和 主机 100.27.48.1 的交互数据报文才会被捕获到。

监视指定协议和端口的数据包

如下只抓取 TCP 协议的 22 端口的数据报,也就是 SSH 协议的数据报文:

$ tcpdump tcp port 22

显示协议头和包内容

加-X 参数,可以把协议头和包内容都原原本本的显示出来(tcpdump 会以 16 进制和 ASCII 的形式显示)

$ tcpdump -X

控制捕获的数据包数量

-c 参数,即 Count 的含义,设置希望 tcpdump 帮我们抓几个包。

$ tcpdump -c xxx

保存捕获到的数据包

# e.g. tcpdump -w test.cap
$ tcpdump -w xxx

参数 -w 直接将包写入文件中,存储到磁盘上,为后续使用。

这个保存的保存可以通过 xftp 传出到本地,然后用 wireshark 工具可以打开,进行更加直观的分析

将流量进行回放

参数-r 可以实现“流量回放”的功能,就是把历史上的某一时间段的流量,重新模拟回放出来,用于流量分析。(就是分析上面捕获的一段流量)

# e.g. tcpdump -r test.cap
$ tcpdump -r xxx

References

测试必杀技之 linux 抓包神器 -tcpdump - 柠檬班的文章 - 知乎